package a07_ThreadPool;

import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * @Author quan
 * @Description 自定义实现线程池
 * @Date 2023/5/12 20:26
 */
public class a03_MyThreadPool {
    //目标：用阻塞队列模拟线程池（创建一些线程表示线程池中已有的工作线程），往线程池中提交任务后，任务被工作线程执行
    //1、定义一个阻塞队列（就代表线程池）,初始化容量为3。--------不理解。注意类型为Runnable
    BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(3);
    //2、核心方法：对外提供一个方法，用来往线程池中提交任务
    public void submit(Runnable task) throws InterruptedException {
        queue.put(task);
    }
    //3、构造方法中，就要创建一些工作线程，让这些工作俩执行上述提交的任务
    public a03_MyThreadPool(int capacity){
        if(capacity <= 0){
            throw new RuntimeException("线程池的数量不能小于0");
        }
        //4、在线程池中创建一些工作线程(创建的个数就是初始化线程池给定的容量数)
        for (int i = 0; i < capacity; i++) {
            Thread thread= new Thread(()->{
                //5、不停的扫描
                while (true){
                    try {
                        //6、取出提交的任务，并执行
                        Runnable task = queue.take();
                        task.run();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            //7、启动线程
            thread.start();
        }
    }
}
